# 插件系统

Module Federation 提供了一套轻量的运行时插件系统，用以实现自身的大多数功能，并允许用户进行扩展。

开发者编写的插件能够修改 `Module Federation` 的默认行为，并添加各类额外功能，包括但不限于：

- 获取上下文信息
- 注册生命周期钩子
- 修改 Module Federation 配置
- ...

## 开发插件

插件提供类似 `() => ModuleFederationRuntimePlugin` 的函数。

### 插件示例

```ts title="custom-runtime-plugin.ts"
import type { ModuleFederationRuntimePlugin } from '@module-federation/enhanced/runtime';

const runtimePlugin: () => ModuleFederationRuntimePlugin = function () {
  return {
    name: 'my-runtime-plugin',
    beforeInit(args) {
      console.log('beforeInit: ', args);
      return args;
    },
    beforeRequest(args) {
      console.log('beforeRequest: ', args);
      return args;
    },
    afterResolve(args) {
      console.log('afterResolve', args);
      return args;
    },
    onLoad(args) {
      console.log('onLoad: ', args);
      return args;
    },
    async loadShare(args) {
      console.log('loadShare:', args);
    },
    async beforeLoadShare(args) {
      console.log('beforeloadShare:', args);
      return args;
    },
  };
};
export default runtimePlugin;
```

注册插件（两种方式选择一种即可）：

- 构建配置中注册插件

```ts title="rspack.config.ts"
const path = require('path');
module.exports = {
  plugins: [
    new ModuleFederationPlugin({
      // ...
      runtimePlugins: [path.resolve(__dirname, './custom-runtime-plugin.ts')],
    }),
  ],
};
```

- 运行时注册插件

```ts
import { registerPlugins } from '@module-federation/enhanced/runtime'
import runtimePlugin from 'custom-runtime-plugin.ts';

registerPlugins([runtimePlugin()]);
```

### 插件结构

函数形式的插件可以 **接受选项对象** 并 **返回插件实例**，并通过闭包机制管理内部状态。

其中各部分的作用分别为：

- `name` 属性用于标注插件名称。
- `fn` 各类钩子。

### 命名规范

插件的命名规范如下：

- 插件的函数通过 default 导出。
- 插件的 `name` 采用 `xxx-plugin` 格式。

下面是一个例子：

```ts
import type { ModuleFederationRuntimePlugin } from '@module-federation/enhanced/runtime';
const pluginFooBar = (): ModuleFederationRuntimePlugin => ({
  name: 'xxx-plugin',
  //...
});

export default pluginFooBar;
```

## hooks

参考 [Runtime Hooks](../../guide/basic/runtime/runtime-hooks)
